/*
 * zhike@yiji.com Inc.
 * Copyright (c) 2017 All Rights Reserved.
 * create by zhike
 * date:2017-03-22
 *
 */
package com.yiji.fintech.musfinance.base.enums;

import com.acooly.core.utils.enums.Messageable;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * sign_info Status 枚举定义
 * 
 * @author zhike
 * Date: 2017-03-22 17:54:49
 */
public enum Status implements Messageable {

		IT("IT", "初始状态"),
		SS("SS", "清算成功"),
		SF("SF", "清算失败"),
		AS("AS", "异步清算"),
		SD("SD", "清算过程中"),
		BS("BS", "银行成功"),
		BF("BF", "银行失败"),
		FS("FS", "网银表单申请成功"),
		BP("BP", "银行处理中"),
		GD("GD", "已报网关"),
		GF("GF", "网关失败"),
		GE("GE", "调用网关异常"),
		AV("AV", "异步验证"),
		VD("VD", "验证中"),
		VS("VS", "验证成功"),
		VF("VF", "验证失败"),
	;

	private final String code;
	private final String message;

	private Status(String code, String message) {
		this.code = code;
		this.message = message;
	}

	public String getCode() {
		return code;
	}

	public String getMessage() {
		return message;
	}

	@Override
    public String code() {
		return code;
	}

	@Override
    public String message() {
		return message;
	}

	public static Map<String, String> mapping() {
		Map<String, String> map = new LinkedHashMap<String, String>();
		for (Status type : values()) {
			map.put(type.getCode(), type.getMessage());
		}
		return map;
	}

	/**
	 * 通过枚举值码查找枚举值。
	 * 
	 * @param code
	 *            查找枚举值的枚举值码。
	 * @return 枚举值码对应的枚举值。
	 * @throws IllegalArgumentException
	 *             如果 code 没有对应的 Status 。
	 */
	public static Status find(String code) {
		for (Status status : values()) {
			if (status.getCode().equals(code)) {
				return status;
			}
		}
		return null;
	}

	/**
	 * 获取全部枚举值。
	 * 
	 * @return 全部枚举值。
	 */
	public static List<Status> getAll() {
		List<Status> list = new ArrayList<Status>();
		for (Status status : values()) {
			list.add(status);
		}
		return list;
	}

	/**
	 * 获取全部枚举值码。
	 * 
	 * @return 全部枚举值码。
	 */
	public static List<String> getAllCode() {
		List<String> list = new ArrayList<String>();
		for (Status status : values()) {
			list.add(status.code());
		}
		return list;
	}

}
